﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace NeuroIris
{
    public class LoadData
    {

        public static IrisLearnPackage Load(string fileName)
        {
            IrisLearnPackage result = new IrisLearnPackage();

            try
            {
                using (StreamReader reader = File.OpenText(fileName))
                {
                    while (!reader.EndOfStream)
                    {
                        string[] line = reader.ReadLine().Split(',');
                        if (line.Length != 5) continue;

                        IrisData iris = new IrisData
                        {
                            A = float.Parse(line[0]),
                            B = float.Parse(line[1]),
                            C = float.Parse(line[2]),
                            D = float.Parse(line[3])
                        };

                        if ("Iris-setosa".Equals(line[4])) iris.Iris = IrisEnum.IrisSetosa;
                        if ("Iris-versicolor".Equals(line[4])) iris.Iris = IrisEnum.IrisVersicolor;
                        if ("Iris-virginica".Equals(line[4])) iris.Iris = IrisEnum.IrisVirginica;

                        if (result.MinValues.A > iris.A) result.MinValues.A = iris.A;
                        if (result.MinValues.B > iris.B) result.MinValues.B = iris.B;
                        if (result.MinValues.C > iris.C) result.MinValues.C = iris.C;
                        if (result.MinValues.D > iris.D) result.MinValues.D = iris.D;

                        if (result.MaxValues.A < iris.A) result.MaxValues.A = iris.A;
                        if (result.MaxValues.B < iris.B) result.MaxValues.B = iris.B;
                        if (result.MaxValues.C < iris.C) result.MaxValues.C = iris.C;
                        if (result.MaxValues.D < iris.D) result.MaxValues.D = iris.D;

                        result.Data.Add(iris);
                    }
                }
            }
            catch (Exception ex)
            {
                result = null;
            }

            return result;
        }
    }

    public class IrisLearnPackage
    {
        private Random _random = new Random();

        public IrisLearnPackage()
        {
            Data = new List<IrisData>();
            MinValues = new IrisData
            {
                A = float.MaxValue,
                B = float.MaxValue,
                C = float.MaxValue,
                D = float.MaxValue
            };
            MaxValues = new IrisData
            {
                A = float.MinValue,
                B = float.MinValue,
                C = float.MinValue,
                D = float.MinValue
            };
        }

        public List<IrisData> Data { get; set; }

        public IrisData MinValues { get; set; }

        public IrisData MaxValues { get; set; }

        public float[] RandomW()
        {
            float[] result = new float[4];

            result[0] = (float)(_random.NextDouble() * (MaxValues.A - MinValues.A) + MinValues.A);
            result[1] = (float)(_random.NextDouble() * (MaxValues.B - MinValues.B) + MinValues.B);
            result[2] = (float)(_random.NextDouble() * (MaxValues.C - MinValues.C) + MinValues.C);
            result[3] = (float)(_random.NextDouble() * (MaxValues.D - MinValues.D) + MinValues.D);

            return result;
        }
    }

    public enum IrisEnum
    {
        IrisSetosa = 1,
        IrisVersicolor = 2,
        IrisVirginica = 3
    }

    public class IrisData
    {
        public float A { get; set; }

        public float B { get; set; }

        public float C { get; set; }

        public float D { get; set; }

        public IrisEnum Iris { get; set; }
    }
}
